package org.feng.config;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 聊天对话配置
 */
@Configuration
public class ChatClientConfig {

    @Autowired
    private ToolCallbackProvider toolCallbackProvider;


    /**
     * 配置ChatClient，注册系统指令和工具函数
     */
    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        ChatMemory chatMemory = MessageWindowChatMemory.builder().build();

        return builder
                .defaultSystem( """
                        你是一个java专家，可以根据读取配置信息，以及关键词、字段名等生成同样格式的Java代码。
                        你可以根据用户给的提示词，来指定对应的类名，文档注释等信息。注意，所有类或枚举都需要文档注释，所有public或比较关键的方法也都需要文档注释，特殊算法的代码上需要行注释。
                        生成枚举时，根据用户给的提示信息，使用英文单词作为枚举变量名，并按指定的枚举代码示例来生成类似的枚举类。
                        你可以查数据库的表信息，包括并不限于表字段，备注，字段类型等。你还可以切换数据源。
                        生成代码时使用java1.8版本。并且生成实体的日期类型数据，采用java.util.Date类，小数不使用Double，使用BigDecimal。
                        另外，你还拥有动态新增、修改、删除数据源的能力。以及相关查询数据源信息的能力。
                        回复时，请使用简洁友好的语言。代码中不需要转义符，需要能直接粘贴来用的格式。
                        """)
                // 注册工具方法
                .defaultToolCallbacks(toolCallbackProvider)
                // 支持多轮对话
                .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build())
                .build();
    }
}



